import PyDGGS


def decode(code, grid_type):
    """
    将格网编码转为经纬度
    :param code: 格网编码
    :param grid_type: 格网类型
    :return: 转化后的经纬度
    """
    # 初始化结构体可用于编码转化：将格网编码转化为经纬度
    kernel = PyDGGS.CreateKernelObj(grid_type)

    # 初始化一个经纬度结构体，用于存储转化后的经纬度
    coord = PyDGGS.GeoCoords()

    # 使用kernel的decode将code转化为经纬度的coord
    kernel.decode(code, coord)

    # 释放kernel结构体内存
    PyDGGS.DestroyKernelObj(kernel)

    return coord


def encode(coord, level, element_type, grid_type):
    """
    将经纬度转为格网编码
    :param coord: 原经纬度坐标结构体
    :param level: 层级
    :param element_type:要素类型
    :param grid_type: 格网类型
    :return: 转化后生成的格网编码
    """

    kernel = PyDGGS.CreateKernelObj(grid_type)

    # 需要先声明code，并设置好要素类型：elementType，和层级：level
    code = PyDGGS.DGGSElementCode()
    code.level = level
    code.elementType = element_type

    # 将经纬度转化为格网编码，将coord转化为code，result为bool型数据，表示转化是否成功
    result = kernel.encode(coord, code)

    # 释放结构体kernel内存
    PyDGGS.DestroyKernelObj(kernel)

    return code


def query(code, grid_type, topo_type):
    """
    拓扑查询
    :param code: 原格网要素编码
    :param grid_type: 格网类型
    :param topo_type: 拓扑查询类型
    :return: 拓扑查询结果
    """
    kernel = PyDGGS.CreateKernelObj(grid_type)

    # 定义一个结构体，用于存储拓扑查询结果
    query_result = PyDGGS.QueryResult()

    # 准备一个整数作为输出参数
    success = kernel.query(topo_type, code, query_result)

    # 释放结构体kernel内存
    PyDGGS.DestroyKernelObj(kernel)

    return query_result


def main():
    level = 5
    grid_type = PyDGGS.DGGSGridType_DGGS_ISEA4H
    element_type = PyDGGS.DGGSElementType_Cell
    topo_type = PyDGGS.DGGSTopoType_RelativeCells

    # 声明一个code，可作为目标来对其进行拓扑查询
    code = PyDGGS.DGGSElementCode()
    code.level = level
    code.basePartition = 1
    code.elementType = PyDGGS.DGGSElementType_Cell
    code.row = 1
    code.col = 2

    # 格网编码转经纬度
    coord = decode(code, grid_type)
    print("经纬度：", coord.lon, coord.lat)

    # 经纬度转格网编码
    coord.lat += 12
    code = encode(coord, level, element_type, grid_type)
    print("格网编码：", code.basePartition, code.row, code.col)

    # 拓扑查询
    query_result = query(code, grid_type, topo_type)
    # 拓扑查询的结果数量
    code_count = query_result.getSize()
    # 遍历所有的查询结果输出
    for i in range(code_count):
        code = query_result.getGridCodeByIndex(i)
        print("拓扑查询结果：", code.basePartition, code.row, code.col)

if __name__ == "__main__":
    main()
